{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据连接\n",
    "## 1、数据加载\n",
    "数据加载器Documnet loader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install pypdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Document(page_content='  \\n[保密]   \\n    聘 用 意 向 书       \\n上海挚想科技有限公司 \\n 1 / 3 \\n \\n \\n  郎亚坤   先生 :  \\n \\n我们很荣幸的通知您已经被怪兽充电录用，特此热忱地欢迎您加入我们的团队，有关职位的具体情况如下： 隶属公司：上海挚想科技有限公司 部门：平台研发部 职位：研发工程师 \\n用工形式：因您尚未毕业，在您毕业之前公司将与您签订实习协议；在您取得毕业证后，公司将与\\n您签订劳动合同，劳动合同首次合同期限为3年（特殊岗位另定），您应聘的岗位试用期为3个月（试用期薪资和正式薪资等同）；试用期满经考核合格者公司即予以正式聘任。 \\n实习津贴：您的实习津贴按照实际出勤天数结算为    200元 /天。 \\n正式薪资：每月基本工资税前    13950    元，季度绩效奖金税前    4650    元；（季度绩\\n效奖金是根据乙方在甲方单位的工作能力、工作成绩以及甲方单位的效益等综合评定的奖金，乙方\\n同意该奖金随当季乙方工作绩效以及甲方单位当季的效益等由甲方综合评定后确定相应数额。因此，基于绩效奖金特性，乙方知晓并确认，该等约定的绩效奖金非固定金额，将依据其实际绩效评定结果按实发放。）；个人的社保、公积金、所得税将由公司在工资中予以扣除、代为缴付。 \\n报到时间：2020  年   2   月   1   日 早 10:00 ', metadata={'source': 'lyk.pdf', 'page': 0}),\n",
       " Document(page_content='  \\n[保密]   \\n    聘 用 意 向 书       \\n上海挚想科技有限公司 \\n 2 / 3 \\n \\n报到地点：上海市长宁区天山西路 799 号 6 楼 01-02 单元 \\n注意： 本公司实行薪资保密，请勿向他人泄露。细致方面如有疑问请与人力资源部 焦蔷 联系。 另，员工入职后，本聘用意向书将继续有效。本聘用意向书非劳动合同，与劳动合同有不一致处，以劳动合同为准。  重要提示：如您有以下任一情形,则本“聘用意向书”无效： 1、在整个应聘过程(包括不限于笔试、面试及入职时)中，向公司提供任何虚假信息。  2、违反公司薪酬保密相关规定，将聘用意向书内容以任何渠道、方式透露给第三方。  3、未能提交原单位离职证明原件、办理社保相关资料；提供任何不真实资料或信息。   请您仔细阅读以下“入职资料单”，做好入职前的准备，祝您在怪兽充电工作愉快。 \\n \\n入职资料单 \\n \\n以下内容如有不明之处可联系焦蔷，联系电话：15618958692。  \\n1、请确认已向 jiaoqiang@enmonster.com邮箱回执入职意向“本人接受上述聘用，并遵守上述\\n约定，愿到贵公司工作”；回执邮件即表示接受聘用；本聘用意向书于 2020 年 11 月  26  日\\n前有效。若在此日期前您未能回复本录用信，本录用信将不再有效； 2、 身份证原件及复印件 3 份 ', metadata={'source': 'lyk.pdf', 'page': 1}),\n",
       " Document(page_content='  \\n[保密]   \\n    聘 用 意 向 书       \\n上海挚想科技有限公司 \\n 3 / 3 \\n \\n3、 招商银行银行卡 \\n4、 一寸证件照 3 张 5、 学生证原件及复印件 1 份 以下在转为正式员工后提交： 6、 最高学历、学位证原件及复印件 1 份 7、 户口本原件、复印件【户主页及本人页】(户口不在身边的，可以直接提供复印件或者扫描件) 8、 入职体检报告单，需为公司合作体检机构出具，公司合作体检机构请查阅【入职体检通知单】 9、 如有职称证书、技能相关证书原件及复印件 1 份  我们坚信，因为您的加盟，怪兽充电将会和您一起健康、快乐地成长！祝成功！                                                                                                                           ', metadata={'source': 'lyk.pdf', 'page': 2})]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain.document_loaders import PyPDFLoader\n",
    "loader = PyPDFLoader(\"lyk.pdf\")\n",
    "documents = loader.load()\n",
    "documents"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于PDF加载器来说，一个document对应的就是PDF的一页"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Document(page_content='  \\n[保密]   \\n    聘 用 意 向 书       \\n上海挚想科技有限公司 \\n 3 / 3 \\n \\n3、 招商银行银行卡 \\n4、 一寸证件照 3 张 5、 学生证原件及复印件 1 份 以下在转为正式员工后提交： 6、 最高学历、学位证原件及复印件 1 份 7、 户口本原件、复印件【户主页及本人页】(户口不在身边的，可以直接提供复印件或者扫描件) 8、 入职体检报告单，需为公司合作体检机构出具，公司合作体检机构请查阅【入职体检通知单】 9、 如有职称证书、技能相关证书原件及复印件 1 份  我们坚信，因为您的加盟，怪兽充电将会和您一起健康、快乐地成长！祝成功！                                                                                                                           ', metadata={'source': 'lyk.pdf', 'page': 2})"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "documents[2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2 文本转换器之分割器：RescursiveCharacterTextSplitter\n",
    "通用型文本分割器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Document(page_content='约定，愿到贵公司工作”；回执邮件即表示接受聘用；本聘用意向书于 2020 年 11 月  26  日\\n前有效。若在此日期前您未能回复本录用信，本录用信将不再有效； 2、 身份证原件及复印件 3 份', metadata={'source': 'lyk.pdf', 'page': 1})"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "\n",
    "text_splitter = RecursiveCharacterTextSplitter(\n",
    "    # 设置一个非常小的文字块大小\n",
    "    chunk_size = 100,\n",
    "    chunk_overlap = 20,\n",
    "    length_function = len,\n",
    ")\n",
    "pages = loader.load_and_split(text_splitter = text_splitter)\n",
    "len(pages)\n",
    "pages[16]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3、文本的词嵌入（Word Embedding）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[0.10239939284358283,\n",
       "  -2.153824939219498,\n",
       "  -0.5206395658942751,\n",
       "  0.6513296609993432,\n",
       "  -0.23730027271623635,\n",
       "  -0.03383851230209103,\n",
       "  -0.6249949019645121,\n",
       "  0.27010456247517367,\n",
       "  0.6082445035050059,\n",
       "  0.34754531618586526],\n",
       " [-0.05290736348470755,\n",
       "  -0.9187656267943913,\n",
       "  -0.297496018281067,\n",
       "  0.9763830905990198,\n",
       "  -0.09815945321899427,\n",
       "  -0.27372410591897023,\n",
       "  0.5260728197354653,\n",
       "  0.1594527183362193,\n",
       "  -0.8614320713304252,\n",
       "  1.7325059851451712]]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain.embeddings import FakeEmbeddings\n",
    "embeddings = FakeEmbeddings(size=1352)\n",
    "embeddings.embed_documents([pages[5].page_content,pages[7].page_content])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.向量存储 与 检索\n",
    "Chromadb是一个本地的向量存储解决方案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pip install chromadb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.embeddings import FakeEmbeddings\n",
    "from langchain.vectorstores import Chroma\n",
    "\n",
    "db = Chroma.from_documents(pages,embeddings)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个db对象就是我们可以直接操作的数据库本身"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "相似度检索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Document(page_content='9、 如有职称证书、技能相关证书原件及复印件 1 份  我们坚信，因为您的加盟，怪兽充电将会和您一起健康、快乐地成长！祝成功！', metadata={'page': 2, 'source': 'lyk.pdf'})"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "query = \"员工\"\n",
    "docs = db.similarity_search(query)\n",
    "len(docs)\n",
    "docs[1]"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
